local id2callback = []
function registerSpell(id, callback){
id2callback[id] = callback
}
...
function runSpell(id){
local callback = id2callback[id[
if (type(callback) == 'function){
callback()
}
}
зависит от твоих нужд
например, мне нужно хранить последние 5 секунд позиций нескольких юнитов, т.е. разбитые на участки по 0.25 секунд снимки хп/мп/координат каждого из них
это 5*4 = 20 значений каждого, итого 80
когда мы доходим до секунды 5.25, то надо сдвигать все предыдущие на единичку назад, и вставлять текущие данные на последний слот
это 79*4 операций чтения и 80*4 записей (считаю грубо, всё для примера)
когда это делается в хештбалице, нагрузка значительно выше выходит, чем если делать на массивах (хт перебирает ключи как ассоциативный массив, а обычный массив просто обращается к памяти с указанным адресом, в разы быстрее).
Но чтобы делать эту процедуру на массивах, тебе нужен индексатор этих самых юнитов, чтобы их уникальный ключ не превышал лимит массива. Это дополнительный код, который тебе нужно реализовать с нуля. Но после реализации система становится быстрее.
Была она до этого медленной? да. Влияло ли это на игру? Нет, это 100-200 микросекунд.
Опять же, когда у тебя есть пре-процессор типа vJASS + сниппеты типа Table , которые имитируют массив самостоятельно, они снимают с тебя часть обязанностей. Но из-за того, что они созданы для ОБЩЕГО случая, они все равно не дадут того выигрыша в скорости, который можешь ожидать.
Используй то, что тебе удобнее, и оптимизируй только когда это реально влияет на игру. habr.com/ru/post/550926
И не забывай, что дота стала популярной еще во времена, когда была написана почти целиком на ГУИ и нихера в ней не пахло даже оптимизацией.
Странный вопрос, скорее всего самый лучший, тот кто не выкладывает свои работы на xgm, лично для меня вот самый топовый картодел из современных Brilock
а так в каждую эпоху был свой уровень качества
Не представляю при каких обстоятельствах ключи могут совпасть, кроме, собственно, введения одинаковых строк. В этой статье упоминается о строковых ключах. Лично я только строковые и использую и никакого дискомфорта не испытываю.
StringHash не менялась с самого её начала, единственная возможная проблема - это "столкновение" строк, когда хеш разных строк приводит к одинаковому результату (то бишь полученное хешированное число одинаковое), но это не так просто достичь и большинство этих проблем создано ограничением integer типа в Jass на int32_t (хотя само значение в памяти использует uint32_t). Но если ответить на твой вопрос и не затрагивать эти нюасны, то ответ - нет.
Почитай про утечки точек, как их создавать и удалять. Не знаю, как в твоём новом патче, но в 1.26 приказ отдаётся максимум 12 юнитам, у тебя может быть также, потому лучше отдавать приказ сразу после создания.
Предлагаю улучшить так:
Создать переменные для двух точек;
В триггере инициализации указать точкам значение центра областей 016 и 025;
Сделать периодический триггер с условием, что Король Мёртвых жив, а в действиях создание групп юнитов в одной точке, а сразу после создания приказ (Last Created Group) Перейти, нападая на противников, в другую точку;
По идее ещё бы отключить триггер за ненадобностью после смерти Короля Мёртвых, раз уж много таких триггеров, но всё равно изменение нагрузки будет незаметным, поэтому можно не отключать.
P. S. Утечка точки весит 0.361 кб, даже если не удалять утечки в этом триггере, то за 30 минут это будет 0.361х4х30=43.32 кб, что вполне приемлимо.
используй хэш таблицу/параллельные массивы/структуры
для каждой волны записывай равкоды юнитов и количество юнитов
при запуске волны считывай равкоды и количество и создавай юнитов на основе этих данных
когда все созданные юниты умерли запускай таймер на 30 секунд по истечению которого начинается следующая волна
разобраться с хэш таблицей/параллельными массивами/структурами и таймерами помогут статьи
Читал новое пользовательские соглашение? Потом разжевывали на одной из тем по патчам рефорджа. Близзарды перестраховались, и теперь низя в карту контент пихать, который не твой или свободно распростроняемый, в противном случае хоть 1 жалоба на твою карту - бан, любой мудак которому че-то не понравится может написать близардам, они не будут разбираться он хозяин контента или нет.
Правообладатели нарут и прочих аниме прав тебе никогда не дадут, даже разговаривать не будут, только юр. Лицаи только много денег, бомжи вроде нас с тобой им не интересны. Но при этом за спасибо тебе никто не даст прав делать карту в которой все бы бесплатно играли.
На всякий случай сделай копию модели, если что-то пойдёт не так. Перейди в редактор анимаций и там выбери первую вкладку, к какому-нибудь объекту привяжи слои, потом на второй вкладке посмотри все анимации, вдруг эти части модели из-за привязки будут криво себя вести. Если криво, то надо привязать к другому объекту, если всё нормально, то сохраняешь изменения.
Ну либо для мультикастера заводим одельного дамми с маной, с атрибутами, но при каждом касте скидываем ему кд и ману ставим на макс (если разумеется каст не зависит от кол-ва текущей маны, иначе на кол-во реального героя).
Ну так же можно сделать дамми аналоги способностей для мульткаста, или юзать мемхак с принудительным кастом абилки (но это подходит лишь для дефолтных абилок).
На днях пришлось ковыряться со звуками - и действительно, недостаточно просто прописать звуку нужный путь. Но и ничего особо сложного нет.
Нужно достать таблицу UI\SoundInfo\UnitAckSounds.slk из War3Patch.mpq. Там довольно просто отредактировать стандартные наборы звуков и, при необходимости, добавить новые.
На примере Малфуриона: есть несколько подряд идущих строк, в первых ячейках которых записано:
Нужно открыть файл таблицу Unit Ask Sounds. slk, находится в архиве с игрой war 3 patch. mpq. Там есть несколько столбцов. Первый столбец слева это название звуков, остальные столбцы - настройки. Собственно, чтобы сделать свой набор, нужно скопировать и изменить другой, и добавить его в таблицу.
Затем изменённый файл запихнуть обратно в архив игры.
Чтобы прикрепить новый набор к юниту, нужно его прописать вручную в соответствующее поле юнита в редакторе объектов, на карте.
Не знаю, будет ли этот приём работать, если изменённый файл таблицы импортировать непосредственно в файл карты. В теории должно. У Доты ведь работает, а там тоже изменённые таблицы slk
Aws, вот, чтобы заменить картинку на свою, перед компиляцией нужно заменить файл Splash.bmp на свой с тем же названием.
Функция ShowSplash(HINSTANCE hInst, int resID, DWORD dwMilliseconds) показывает изображение перед запуском варкрафта в течении dwMilliseconds миллисекунд, остальное менять не нужно.
А иконку и описание программы, думаю сами сможете сделать.
похоже более всего на мусор, попадающий в память откуда-то извне. Обычно пропущенная строка автокаста такой фигней страдает. Нельзя точно сказать, нужно менять поля и смотреть. К счастью, описания можно менять и локально, не перепаковывая карту
Это не то что вам нужно, этот хук (кстати он не единственный) настраивает абилке берсерка другой ИД приказа, позволяя добавить 1 юниту 100500 абилок на основе берсерка и они не будут уходить в кд одновременно. Нужно это для того чтобы у юнита было сколько угодно абилок не сбивающих текущий приказ. Требуется абилка на основе берсерка, абилка донор приказа и этот код. ВАЖНОЕ НО, абилка донор приказа не должна использоватся в карте, по крайней мере до появления абилки берсерка с модифицированным приказом. Юнит с таким образом модифицированным берсерком должен появится на карте после выполнения этого хука, и никак иначе.
Есть же способность "поставка ресурсов" там как у канала настраивается ид приказа и стоймость золота и дерева.
У меня была похожая проблема - нужно было создать книгу заклинаний и магазин заклинаний со случайной генерацией. А также инвентарь на 300 предметов, в виде рюкзака с несколькими отделениями. Пришлось создать базу данных.
Для этого хватит и обычного джасса.
Создай массив интегер
Создай набор интегер констант, отвечающих за столбцы (чтобы создать условно двумерный массив, то есть таблицу)
Допустим у тебя 150 предметов
Первая константа- ид предметов, второй столбец, равно 200 (чтобы с запасом)
Вторая константа- кастомные данные предметов, равно 400
И так далее
Поиск и работа с такой таблицей делай по принципу:
По циклу перемотать первый столбец, пока ид не совпадёт, используя обращение к массив по типу имя_массива[константа_столбца+индекс]
Текущий индекс массива в случае совпадения будет искомым
Его запоминаем
Затем берём другие данные из базы по типу имя_массива[константа_второго_столбца+текущий_индекс]
Готово.
Не нужны хеш таблицы, лишние функции итд. Столбцов можно сколько хочешь написать, в пределах массива, хотя можно создать и ещё массивы, например массив юнитов, и тогда получится подобие трёхмерного (!) Массива. Ориентироваться по нему можно с помощью тех же констант.
А, и чтобы самому иметь наглядное представление о своей базе, рекомендую сначала нарисовать её в Excel.
Для каждого дерева нужны три модели: обычная, неактивная (с названием Doodads\Terrain\AshenTree\AshenTree0S.mdx, например) и неактивная разрушенная (Doodads\Terrain\AshenTree\AshenTree0D.mdx). У неактивных моделей должна быть только одна анимация — Stand. У первой — только деревце, у второй — только пенёк, соответственно.
Когда с деревом никто не взаимодействует, отображаются неактивные модели. Ты их не заменил, потому такая вот фигня.
Как сделать полноценно работающие деревья с моделями, не заменяющими стандартные, я не знаю. Возможно, никак.
Просто делаешь апгрейды-пустышки или спеллы-пустышки, отлавливаешь в триггере событие апгрейда/каста и создаешь на месте юнита, который сделал апгрейд/кастанул спелл, 5 рабов согласно конкретному апгрейду/спеллу.
да никак, это не нужно с авторами карт вести диалог или сплатформами, мало того что хостботы не могут определить наличие читов, так и игры хостят случайные пользователи - даже если забанил, новый акк и по новой, а рассматривать жалобы нужна целая тех поддержка из десятков человек.
Так что просто не играй с читерами, хости сам, кикай читеров, в любимую карту можно вшить античит для 1.26 версии вара.
Потому что огромный Нестандартные объекты может тысяч или больше или Спелл герой до 100 уровень.
из них 60 загрузка просто висит на 1/5.
Если нетак? Проверь если есть файлы war3map.j папка Game\WarcraftIII, надо удалить файл. очень давно тоже 1 раз что за вылет или неправильно выполняет триггер.
Есть способы ускорить загрузку карты не экономя в редакторе объектов
Есть Widgetizer, там очень быстрая загрузка игра, но плохо работает спелл или текст.
Какие именно эффекты в модели дублировал, а какие создал с нуля? Надо попытаться сравнить эти эффекты, сохранив модель в формат mdl и открыв в блокноте. Может быть дело даже не в самих эффектах, а в упоминании где-то их ID.
Adantarn, запускай редактор в совместимости с Windows 7. Ещё перезагрузи компьютер (именно перезагрузи, а не выключи и включи).
Также дело может быть в настройках графики. Выкрути их в игре на максимум или в редакторе, убрал галку "Использовать настройки игры" и поставив свою конфигурацию.
Если всё это не поможет, то удаляй всех юнитов и расставляй их уже на новом компьютере.
PT153:
Вспомнил про один баг. Есть сделать PauseTimer() на периодический таймер, а потом на этой таймер использовать ResumeTimer(), то таймер повторит свой цикл лишь раз, а потом остановится.
сам не пользуюсь ResumeTimer, но щас проверил, действительно не работает что-то. Видимо, это работает только тогда, когда таймер не до конца дошел.
можно обойтись и без ResumeTimer
понимаю, ты хочешь сделать какое-то ограничение после возвращения урона. Спустя 3 секунды возвратка может снова возвращать урон.
Можно было сделать по-другому.
Еще не понимаю, зачем нам нужен периодический таймер.
можем логическую переменную b завести и таймер t
нанес противник урон = проверяем логическую переменную, если истина, запускаем одноразовый таймер, и ставим ложь в логической переменной = false
if b then
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.?mdl",u,"origin"))
call UnitDamageTarget(udg_u,u,r*5,false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS)
call BJDebugMsg("Reflected:"+R2S(r*5))
call TimerStart(udg_t,0.5,false,function t3a)
set b = false
endif
когда таймер запустится
function t3a takes nothing returns nothing
call PauseTimer(udg_t)
set b = true
endfunction
думаю все что надо это call ResumeTimer() заменить на call TimerStart()
Ну если у тебя через локалку что-то неправильно иногда работает, значит просто у тебя где-то ошибка (или ты вообще делаешь это не так).
Для того что бы работать парой таймер+юнит впринципе то больше ничего и не нужно - таймер и сам юнит. Но если у тебя должно запускаться параллельно несколько точно таких же таймеров, то тут может подойти массив таймеров (и массив юнитов). При срабатывании одного из таймеров ты можешь ссылаться на юнита записанного под тем же индексом массива ( unit[X] и timer[X] соответственно).
А ещё в триггер можно добавлять события на срабатывания новых таймеров.
E: Unit starts the effect of an ability.
C: Ability being cast =
A: Set Casting unit Life to (Life of Casting unit + 200).
Вот скрин настройки действия.
Сначала просто создай способность на основе способности "Канал" и в разрешённых целях поставь те, к кому она может прыгать. Потом сделай способность на основе "Ауры выносливости" Вождя минотавров и сделай разрешенные цели - только сам герой. Затем создай способность на основе "Книги заклинаний" и положи в эту книгу свою другую созданную способность. Сделай 2 триггера - 1-ый реагирует на применения твоего скилла - телепортирует героя к цели способности, даёт мортре способность на основе книги заклинаний, блокирует для игрока мортры эту способность на основе книги заклинаний и запускает новую переменную таймера на время действия бонуса к атакспиду.
2-й триггер реагирует на истечение таймера - разблокирывает и удаляет способность на основе книги заклинаний у мортры. Всё
В триггерах тип действий "Камера". Если конкретно расстояние до цели надо поменять, то "Камера - Установить Поле Камеры (Время)" ("Камера - Set Camera Field (Timed)").
Вероятнее всего, ты повышаешь камеру выше скайбокса.
Вероятные решения проблемы:
а) Уменьшить самих юнитов и стилизовать ланд под маленькие модели.
б) Вставить нестандартный скайбокс с огромным размером.
(я бы выбрал первый вариант, потому что он круче)
koloff, а что больше 10000 не прописывается? я знаю, что настройки тонкая вещь, и там могут быть ограничения. Пока я сам не пробовал просматривать объекты с такой дальностью.
Можно создать скрытый спеллбук и поместить способности туда. Берем способность предмета "Книга заклинаний", добавляем в нее уворот и крит, даем нужному юниту и запрещаем триггерно эту способность для владельца юнита.
В способности героя добавляются способности с галочкой, что они геройские, а в возможные способности добавляются способности воина или предмета (хотя через шифт можно любую способность в эти параметры пихнуть). Предполагаемое отличие в прокачке, изначально геройские недоступны, но прокачиваемы с уровнем, а возможные способности изначально доступны, но прокачиваемы триггерно. Хотя я не проверял что будет если пихнуть способность воина с уровнями на место геройских абилок
похоже более всего на мусор, попадающий в память откуда-то извне. Обычно пропущенная строка автокаста такой фигней страдает. Нельзя точно сказать, нужно менять поля и смотреть. К счастью, описания можно менять и локально, не перепаковывая карту
На карте нет ни одной декорации, нижняя поверхность collision box которой не погружена в террейн целиком, так что можно предположить, что нижняя поверхность попросту не обсчитывается физической моделью.
Из всего этого я могу сделать вывод, что в каждой декорации дополнительно к её координатам хранится только длинна стороны её collision box (вернее, её половина)
я уже точно не помню но как припомнил там суть что идёт евент входа в регион соответсвенно регион дефайнит ХУ оси и отдельно есть мин/макс екстенды этого объекта и поидеи всё. юнит входит в регион чекается где он. скорее всего в движке движения юнита есть "потолок" и "пол"
function Trig_Doodads_Actions takes nothing returns nothing
set ax=35
call CreateHWRectBR(-8174,-3900,-7914,-3639,1054,1679)
это я для теста делал т.е. по этому "в 3д" можно бегать (спиральная лестница)
if xux.hwmaxz!=0 and xux.hwmaxz-rr>xux.Zsize then//mhg>xux.Zsize then
это чек на сабж потолка
мне просто лень настраиваеть ворледитор и тулы что бы запустить АОС с той лестницей и сделать видео с демо.
с другой стороны возможно позже и сделаю.
система максимально простая что бы вц3 не обсирался там жасс и так еле дышит.
JPNG и используешь стандартные функции. Есть еще Zephir и HiveWE, но там немножко будет гемморно. Unlimited давно использовался до JPNG, там вагон фич для ГУИ, но там надо вкуривать и изучать. А ломал сей редактор карты из-за функций интеграции нестандартных функций в функции карты для работы в редакторе(извиняюсь за тавтологию).
ставишь x на 0 ставишь y на -11 и вуаля ионка скрыта спелл работает, но учитывай то что за приказ он время тратить будет если ты отдал другйо приказ во время каста он не срабоатет у меня так захват портала рабоатет
а способ выше некоторые способности не работают только x 0 и y -11 робит
» WarCraft 3 / Лучшие
» WarCraft 3 / StringHash
» WarCraft 3 / Волны атаки
» WarCraft 3 / Где можно скачать модель
» WarCraft 3 / Проблема с моделю
» WarCraft 3 / Урон способности от атрибута
» WarCraft 3 / Набор звуков
» WarCraft 3 / Какая должна быть основа ?
» WarCraft 3 / Импортированные модели не видны в самой игре
» WarCraft 3 / Как сделать выбор ?
» IrInA Host Bot / Читеры
» WarCraft 3 / Отменить телепортацию
» WarCraft 3 / Почему вылетает редактор ?
» WarCraft 3 / Таймеры срабатывание триггера
» WarCraft 3 / Как на этом сайте скачать модель?
» WarCraft 3 / Помогите сделать способность
» WarCraft 3 / МОДЕЛЬ
» WarCraft 3 / Камера
» WarCraft 3 / Какие способности дать герою ?
» WarCraft 3 / А где играть то?
» WarCraft 3 / Вопрос по разрушаемым объектам
» WarCraft 3 / Описания в WarCraft 3
» WarCraft 3 / Как скрыть иконку способности